Docker Swarm
本篇主要參考
今天就輕鬆一下,做一個小比較
參考:k8s vs docker swarm
https://www.spec-india.com/blog/kubernetes-vs-docker-swarm-a-complete-comparison-guide/
Controller: Manager, Master
Slave: Worker, Nodes
Sotrage: Volumes, Persistent and Ephermal
Deployment unit: Task, Pod
Port: Published Port, EndPoint
使用Kubernetes(安裝難度高,要有很多網管知識)
完整的部署和監控
可靠性高(容錯率高)、反應快
開發環境複雜、資源需求變化大
Cluster很大很複雜
使用Docker Swarm
安裝、設定簡單
你想要的image,docker hub上都找的到,而且不會差太多
小型、簡單
你很熟docker API,或你的環境都吃docker
不想燒太多時間在搞架構的
===========
如有其他好康,請留言推薦喔!
除了免費課程,其他的課我沒買,不過大家可以找Docker SWARM,例如:
如果工作上有用到就可以入手
除了等「300$時再買」、「看評等高的」、「上課時數高的」,
最重要的是看「此課程的課程大綱」
例如:
我想練習在local端架k8s,並且是多個Node(不是minikube)
那如果課綱都在AWS、GCP玩的,或環境安裝是minikube的,基本上就不適合你買了
(300$也是錢呀)
本來今天想這樣就過渡過去,但實在有點不好意思
如開頭所述,想快速起步,看 yangj26952 大大的文章就好囉
這裡補充在udemy的docker課程中,2門有提到Docker Swarm的,那時是免費的。
首先來看
直到10/18,這個課程還是免費的,裡面有較完整的每個Node的IP、Domain Name的練習檔
趕快去取得吧~
跟docker-machine、docker-compose不同,
Docker Swarm不用另外安裝程式,例如:
# Manager
$ docker run -d -p 4000:4000 swarm manage -H :4000 --replication --advertise 10.1.3.228:4000 consul://10.1.3.228:8500
# Worker加入swarm,--advertise類似傳達(佈告欄),consul是用來通訊
$ docker run -d swarm join --advertise=10.1.3.229:2375 consul://10.1.3.228:8500
# 2375(Docker Engin Port 沒加密的)
# 2376(Docker Engin Port 有ssh加密的)
# 2377(Docker Swarm Port)
# 只要有docker指令就好了
此課程的網路規劃
Node:6個(manager1,2,3、node1,2,3)
management subnets:3個
prod subnets:3個
不過只能在AWS的eu-west-1 Region建置,而且也只屬實驗性質,不適合用於production
我們看一下指令就好了
就要有憑證,我們私底下實驗,就自己當CA來作自簽憑證,也順便練習,才不會在正式環境出包
$ openssl genrsa -out ca-key.pem 2048 # 長度,現在2048是標配了,愈長愈安全,簽愈慢、愈費電
$ openssl req
-config /usr/lib/ssl/openssl.cnf # 設定檔
-new -key ca-key.pem
-x509 # 最常用的格式
-days 1825 # 有效天數
-out ca-cert.pem # ca憑證
$ openssl genrsa -out manager1-key.pem 2048
# (1)
$ openssl req -subj "/CN=manager1" # common name
-new -key manager1-key.pem -out manager1.csr # 用manager1-key.pem 產生csr檔給ca簽發憑證
# (2)
# extfile.cnf:也把這些ip納進去,以防惡意第3者拿著manager1的憑證在公司內部亂騙
$ echo subjectAltName = IP:10.0.1.5,IP:127.0.0.1 > extfile.cnf
# (3)CA用上面的(1)、(2)來產生manager1的憑證
$ openssl x509 -req -days 365
-in manager1.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial
-out manager1-cert.pem -extfile extfile.cnf
# 同manager1的產生方式,就不再說明囉,一回生、二回熟
# 等手打到瘋掉,再導入ansible用script產生
$ openssl genrsa -out node1-key.pem 2048
$ openssl req -subj "/CN=node1" -new -key node1-key.pem -out node1.csr
$ echo subjectAltName = IP:10.0.4.5,IP:127.0.0.1 > extfile.cnf
$ openssl x509 -req -days 365 -in node1.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out node1-cert.pem -extfile extfile.cnf
# 同manager1的產生方式,就不再說明囉
$ openssl genrsa -out client-key.pem 2048
$ openssl req -subj "/CN=client" -new -key client-key.pem -out client.csr
$ echo extendedKeyUsage = clientAuth > extfile.cnf
$ openssl x509 -req -days 365 -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf
# 只列1個,scp指令很重要喔,順便學一下
$ scp -i 用來ssh的PrivateKey.pem # 遠端的 ~/.ssh/authorized_keys 要先設定好喔
./ca-cert.pem # local端的檔案
ubuntu@manager1:/home/ubuntu/.docker/ca.pem # copy到目的主機
$ scp -i 用來ssh的PrivateKey.pem ./manager1-cert.pem ubuntu@manager1:/home/ubuntu/.docker/cert.pem
$ scp -i 用來ssh的PrivateKey.pem ./manager1-key.pem ubuntu@manager1:/home/ubuntu/.docker/key.pem
$ vim /etc/default/docker
加入
-H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/home/ubuntu/.docker/ca.pem --tlscert=/home/ubuntu/.docker/cert.pem --tlskey=/home/ubuntu/.docker/key.pem
$ service docker start # 重啟 docker service
$ service docker status # 看有沒有吃成功
建Docker Swarm主要有下列3步驟:
功能:
組成元件:
/etc/default/docker # 設定檔,binary目錄、daemon startup options、HTTP proxy、暫存檔目錄
docker ps && docker images
課程指令解析:
NODE1
docker run --restart=unless-stopped -d -h consul1 --name consul1 -v /mnt:/data \
-p 10.0.1.5:8300:8300 \
-p 10.0.1.5:8301:8301 \
-p 10.0.1.5:8301:8301/udp \
-p 10.0.1.5:8302:8302 \
-p 10.0.1.5:8302:8302/udp \
-p 10.0.1.5:8400:8400 \
-p 10.0.1.5:8500:8500 \
-p 172.17.0.1:53:53/udp \
progrium/consul -server -advertise 10.0.1.5 -bootstrap-expect 3
NODE2
docker run --restart=unless-stopped -d -h consul2 --name consul2 -v /mnt:/data \
-p 10.0.2.5:8300:8300 \
...略
progrium/consul -server # 3年前更新的image檔,可以docker hub看
-advertise 10.0.2.5 # 有自己的佈告欄
-join 10.0.1.5 # 指到大哥manager1
NODE1
docker run --restart=unless-stopped -d -h consul-agt1 --name consul-agt1 \
-p 8300:8300 \
-p 8301:8301 -p 8301:8301/udp \
-p 8302:8302 -p 8302:8302/udp \
-p 8400:8400 \
-p 8500:8500 \
-p 8600:8600/udp \
progrium/consul -rejoin # 一樣的image
-advertise 10.0.4.5 # 這個我看不懂
-join 10.0.1.5 # 加到manager1的consul service
$ docker exec -it consul<1/2/3> bash # 進到別的NODE的consul的bash裡面
$ consul members
功能:
課程指令解析:
MNAGER1:名稱mgr1
$ docker -H tcp://manager1:2376
--tlsverify
--tlscacert=/home/ubuntu/.docker/ca.pem
--tlscert=/home/ubuntu/.docker/cert.pem
--tlskey=/home/ubuntu/.docker/key.pem run
--restart=unless-stopped # 除了啟動時,其他錯誤狀態會自動restart
-d -h consul1 --name consul1
-v /mnt:/data
-p 10.0.1.5:8300:8300
-p 10.0.1.5:8301:8301
-p 10.0.1.5:8301:8301/udp
-p 10.0.1.5:8302:8302
-p 10.0.1.5:8302:8302/udp
-p 10.0.1.5:8400:8400
-p 10.0.1.5:8500:8500
-p 172.17.0.1:53:53/udp
progrium/consul -server
-advertise 10.0.1.5
-join 10.0.2.5
# NODE1
$ docker run
# 主要差在這3行
--restart=unless-stopped
-h mgr1 --name mgr1 -d -p 3375:2375 swarm manage
--replication
--advertise 10.0.1.5:3375
consul://10.0.1.5:8500/
# NODE1,swarm join指令,列在這裡比較好比較
docker run -d swarm join
--advertise=10.0.4.5:2375
consul://10.0.4.5:8500/
$ docker -H tcp://manager1:2376
# 2376:Swarm Manage的Port,用來操作Docker Cluster
# 2376(Docker Engin Port 有ssh加密的)
--tlsverify
--tlscacert=/home/ubuntu/.docker/ca.pem # CA憑證(自簽的話,自己就是CA囉,常用於公司內部)
--tlscert=/home/ubuntu/.docker/cert.pem # 用戶自己的憑證(可用public key驗,cert.pem裡面會附)
--tlskey=/home/ubuntu/.docker/key.pem # private key(私鑰)
run --restart=unless-stopped
-h mgr1 --name mgr1 -d -p 3376:2376
-v /home/ubuntu/.docker:/certs:ro
swarm manage # 驗明正身
--tlsverify --tlscacert=/certs/ca.pem --tlscert=/certs/cert.pem --tlskey=/certs/key.pem
--host=0.0.0.0:2376
--replication
--advertise 10.0.1.5:2376
consul://10.0.1.5:8500/
-在每個node執行,這樣各node才知道有哪些服務可用(例如:Consul、etcd、dns)
$ docker run -d --name registrator -h registrator
-v /var/run/docker.sock:/tmp/docker.sock
gliderlabs/registrator:latest # https://github.com/gliderlabs/registrator
consul://10.0.1.5:8500
有用憑證的CONSUL SERVERS、CONSUL CLIENTS就略過囉
差別就是給那3個pem檔
還有用-rejoin
課程指令解析:
MNAGER1:名稱mgr1
$ docker -H tcp://node1:2376
--tlsverify
--tlscacert=/home/ubuntu/.docker/ca.pem
--tlscert=/home/ubuntu/.docker/cert.pem
--tlskey=/home/ubuntu/.docker/key.pem
run -d -h join --name join
swarm join
--advertise=10.0.4.5:2376
consul://10.0.4.5:8500/
今天大概就是這樣囉,
可惜沒有實作
但希望指令的部分有幫助到大家,尤其是憑證的部分,畢竟在container之間傳訊息沒用ssh也是粉危險der
而且,沒有憑證怎麼知道對方是不是假冒的?
至於,想進一步實作的朋友,不好意思啦
還是請參考專業課程喔
但記得先看清楚課程大綱,很有可能該課程並不適合你
如果有空再來研究官網文件
https://docs.docker.com/engine/swarm/